#include <logbase.h>

/*
##########################################
指针共同特点：
a==&a[0]，&a[n]==a+n
##########################################
常量指针，保存常量元素的指针：
定义：
char const *a; const char *a;
说明：
a的值可以改；内容不可改；a的值与&a不同；sizeof(a)==8
##########################################
指针常量，保存指针的常量：
定义：
char * const a;
说明：
a的值不可变；内容可变；a的值与&a不同；sizeof(a)==8
##########################################
指针变量，保存指针的变量：
定义：
char *a;
说明：
a的值可以改；内容可改；a的值与&a不同；sizeof(a)==8
##########################################
数组，特殊指针常量：
定义：
char a[10];
说明：
a的值不能改；内容可以改；a的值和&a都是自己；sizeof(a)==元素长度*元素个数．
*/

#define PRE_COMPILE_FAIL_FLAG 0
int main(int argc, char **argv)
{
    {
        // 数组
        char tmpa[10];
        logdebugc("a=%p;&a=%p", tmpa, &tmpa); // 值与取地址一样。
        tmpa[0] = 1;                          // 内容可变
#if PRE_COMPILE_FAIL_FLAG
        tmpa += 1; // 值不可变。
#endif
    }

    {
        // 指针
        char *tmpa = (char *)malloc(10);
        char *tmpo = tmpa;
        logdebugc("a=%p;&a=%p", tmpa, &tmpa); // 不一样。
        tmpa[0] = 1;                          // 内容可变
        tmpa += 1;                            // 值可变。
#if PRE_COMPILE_FAIL_FLAG
        free(tmpa); // 不是malloc分配的地址会导致崩溃。
#else
        free(tmpo);
#endif
    }

    {
        // 常量指针
        char const *tmpa = (char *)malloc(10);
        char *tmpo = (char *)tmpa;
        logdebugc("a=%p;&a=%p", tmpa, &tmpa); // 不一样。
#if PRE_COMPILE_FAIL_FLAG
        tmpa[0] = 1; // 内容不可变
#endif
        tmpa += 1; // 值可变。
#if PRE_COMPILE_FAIL_FLAG
        free(tmpa); // 不是malloc分配的地址会导致崩溃。
#else
        free(tmpo);
#endif
    }

    {
        // 指针常量
        char *const tmpa = (char *)malloc(10);
        char *tmpo = tmpa;
        logdebugc("a=%p;&a=%p", tmpa, &tmpa); // 不一样。
        tmpa[0] = 1;                          // 内容可变
#if PRE_COMPILE_FAIL_FLAG
        tmpa += 1; // 值不可变。
#endif
#if PRE_COMPILE_FAIL_FLAG
        free(tmpa); // 不是malloc分配的地址会导致崩溃。
#else
        free(tmpo);
#endif
    }

    return 1;
}
